#include <iostream>
#include <string>
#include <list>
using namespace std;

// class Person
// {
// public:
//     Person(const string& name = "李四"):_name(name)
//     {}

//     void func()
//     {
//         cout << _name << endl;
//     }

// protected:
//     string _name;
//     int _id = 10;
// private:
//     int _age;
// };

// //如果是成员函数：函数名相同就会构成隐藏

// class Student : public Person
// {
// public:
//     Student(const string& name = "wangwu"):Person(name){}
//     void func()
//     {
//         cout << _id << endl;
//         cout << Person::_id << endl;
//     }
// protected:
//     int _stunum;
//     int _id = 20;
// };


// class A
// {
// protected:
//     int _a;
// private:
//     int _c;
// };

// class B : public A
// {
// protected:
//     int _b;
// };

// int main()
// {
//     Student s;
//     s.Person::func();

//     // B b;

//     // cout << sizeof(b) << endl;
//     // Student s;
//     // s.func();

//     // Student s;
//     // Person p = s;
//     // p.func();

//     // Person& r = s;
//     // r.func();
//     return 0;
// }


// class Person
// {
// public:
//     Person(const char* name = "二娃"):_name(name)
//     {
//         cout << "Person()" << endl;
//     }

//     Person(const Person& p): _name(p._name)
//     {
//         cout << "Person(const Person& p)" << endl;
//     }

//     Person& operator=(const Person& p)
//     {
//         cout << " Person& operator=(const Person& p) " << endl;

//         if(this != &p)
//             _name = p._name;
        
//         return *this;
//     }

//     ~Person()
//     {
//         cout << "~Person() " << endl;
//     }
// protected:
//     string _name;
// };

// class Student : public Person
// {
// public:
//     Student(const char* name,int id)
//     :Person(name),_id(id)
//     {
//         cout << "Student(const char* name,int id)" << endl;
//     }

//     Student(const Student& s)
//     :Person(s),_id(s._id)
//     {
//         cout << "Student(const Student& s)" << endl;
//     }

//     Student& operator=(const Student& s)
//     {
//         cout << "Student& operator=(const Student& s)" << endl;
//         if(this != &s)
//         {
//             _id = s._id;
//             Person::operator=(s);
//         }
//         return *this;
//     }

//     //子类的析构函数和父类的析构函数构成隐藏关系
//     //由于多态的原因，析构函数被特殊处理：函数名都会被处理destructor()
//     //为了保证先子后父，父亲的析构会在子类析构后自动调用
//     ~Student()
//     {
//          cout << "~Student()" << endl;
//     }
// private:
//     int _id;
// };

// int main()
// {
//     Student s("张三",10);
//     Student s1(s);

//     Student s2("李四",10);
//     s = s2;
//     return 0;
// }

// template <class T>
// class A
// {
// public:

//     A(const T& a):_a(a)
//     {
//         cout << "A(const T& a):_a(a)" << endl;
//     }

// private:
//     T _a;
// };

// template <class T,class T1>
// class B : public A<T>
// {
// public:
//     B(const T& a,const T1& b)
//     :A<T>(a),_b(b)
//     {
//         cout << "B(const T1& a,const T2& b)" << endl;
//     }

//     void func()
//     {
//         cout << _b << endl;
//     }

// private:
//     T1 _b;
// };

// int main()
// {
//     B<int,string> a(10,"李四");
//     a.func();
//     return 0;   
// }

// class Person
// {
// public:
//     Person()
//     {
//         _count++;
//     }
// protected:
//     string _name;
// public:
//     static int _count;
// };

// int Person::_count = 0;

// class Student : public Person
// {
// public:
//     void func()
//     {
//         cout << Person::_count << endl;
//     }
// protected:
//     int _stunum;
// };

// int main()
// {
//     Student s[10];
//     s[0].func();

//     return 0;
// }

class Person
{
public:
    //string _name;
    int _a;
};

class Student : virtual public Person
{
protected:
    int _num;
};

class Teacher : virtual public Person
{
protected:
    int _id;
};

class Assistant : public Student, public Teacher
{
protected:
    int _majorCourse;
};

int main()
{
    Assistant at;
    //at._name = "小张";
    cout << sizeof(at) << endl;
    
    //int a = 10;
    // int* pa = &a;
    // cout << sizeof(pa) << endl;
    return 0;
}

